package com.compmov.webservice;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

import com.compmov.datamodel.Lugar;
import com.compmov.libraries.QueryParamDictionary;
import com.google.gson.Gson;

public class LugarWSClient {
	public static final String TAG = "WEBSERVICE";
	private WebServiceClient webServiceClient;
	
	
	public LugarWSClient(String WSName) {
		super();
		this.webServiceClient = new WebServiceClient("/rest/"+WSName);
	}
	
	public LugarWSClient(WebServiceClient webServiceClient) {
		super();
		this.webServiceClient = webServiceClient;
	}

	public List<Lugar> buscarLugar(Lugar lugarFiltro, Boolean sugerido, Integer ranking, Double latitude, Double longitude, Integer ide_per) throws WSClientException {
		Gson gson = new Gson();
		String jsonCad ;
		// Crear mapa de parametros para el web service
		Map<String, String> params = new HashMap<String, String>();
		jsonCad = gson.toJson(lugarFiltro,Lugar.class);
		params.put(QueryParamDictionary.LUGAR_PARAM, jsonCad);
		jsonCad = gson.toJson(sugerido,Boolean.class);
		params.put(QueryParamDictionary.LUGAR_SUGERIDO, jsonCad);
		jsonCad = gson.toJson(ranking,Integer.class);
		params.put(QueryParamDictionary.LUGAR_RANKING, jsonCad);
		jsonCad = gson.toJson(latitude,Double.class);
		params.put(QueryParamDictionary.LUGAR_POSICION_LATITUD, jsonCad);
		jsonCad = gson.toJson(longitude,Double.class);
		params.put(QueryParamDictionary.LUGAR_POSICION_LONGITUD, jsonCad);
		jsonCad = gson.toJson(ide_per,Integer.class);
		params.put(QueryParamDictionary.PERSONA_ID_PARAM, jsonCad);

		Log.d(TAG, "Invocando");

		String response = webServiceClient.webPut("/getByFilters", params);
		Log.d(TAG, "RESPONSE = " + response);
		try {
			WSError error = gson.fromJson(response, WSError.class);
			// Si no hay ningun error se intenta parsear el contenido de la
			// respuesta
			if (error.getError_description() == null) {
				List<Lugar> lugares = new LinkedList<Lugar>();
				try {
					// Crear un nuevo objeto JSON de la cadena del response
					JSONObject jsonObj = new JSONObject(response);
					// Obtener todas las personas que se encuentren en el
					// arreglo persona
					JSONArray jsonLugar = jsonObj.optJSONArray("lugar");
					//Si es un objeto arreglo valido, se recorre lugar a lugar
					if (jsonLugar != null) {
						for (int i = 0; i < jsonLugar.length(); i++) {
							// Se crea el objeto JSON correspondiente
							JSONObject lugarJSON = jsonLugar.getJSONObject(i);
							// Se parsea el objeto de JSON a la clase lugar y
							// se
							// agrega a la lista
							Lugar l = gson.fromJson(
									lugarJSON.toString(), Lugar.class);
							lugares.add(l);
						}

					} else {
						//Si no es un arreglo, se trata como un objeto simple
						JSONObject jsonLugarObj = jsonObj
								.getJSONObject("lugar");
						Log.d(TAG,
								"JSONLUGAR= " + jsonLugarObj.toString());
						//Se parsea a tipo Lugar
						Lugar l = gson.fromJson(
								jsonLugarObj.toString(), Lugar.class);
						//Si no es vacia, se agrega a la lista
						if (l.getId() != 0) {
							lugares.add(l);
						}
					}
					for(Lugar l : lugares){
						l.setUrlPrincipal(WebServiceClient.getServerURL()+l.getUrlPrincipal());
					}
					Log.d(TAG, lugares + "");
					return lugares;
				} catch (JSONException e) {
					Log.e(TAG, e.getMessage(), e);
					throw new WSClientException(e);
				}
			} else {
				Log.e(TAG, error + "");
				throw new WSClientException(error);
			}
		} catch (Exception e) {
			Log.d(TAG, e.getMessage());
			throw new WSClientException(e);
		}
	}

	
}
